// request({
//     url:"",
//     success:()=>{},
//     type:"get",
//     data:{},
//     error:()=>{},
//     timeout:1000,
//     dataType:"json",
//     filedName:"abc"
// })
function request(ops){
    // 1. 默认参数的处理
        // 可选参数，必然要有默认值
        // 可选函数，可以没有默认值，但是执行之前一定要先判断
    let {url,success,type="get",data={},error,timeout=1000,dataType="text",filedName=""} = ops;

    // 4. 处理数据
    let str = "";
    for(let i in data){
        str += `${i}=${data[i]}&`;
    }

    // 5. 根据请求方式拼接url
    if(type !== "post"){
        url = url + "?" + str + "_qft_=" + Date.now();
    }

    // 2. 判断开启ajax
    let xhr;
    if(type !== "jsonp"){
        // 3. 创建xhr对象
        xhr = new XMLHttpRequest();
        // 准备开启请求
        xhr.open(type, url);
        // 6. 开启监听
        xhr.onload = function(){
            if(xhr.status === 200){
                // 13. 发送数据之前，判断是否需要解析数据
                const res = dataType==="json" ?  JSON.parse(xhr.responseText) : xhr.responseText;
                // 7. ajax的成功
                // 更严谨的逻辑：成功之后，没有失败，也不能再次成功
                success && success(res);
                error = null;
                success = null;
            }else{
                // ajax的失败
                // 更严谨的逻辑：成功之后，没有失败，也不能再次成功
                error && error(xhr.status);
                success = null;
                error = null;
            }
        }
        // 8. 根据get或post执行send
        if(type === "get"){
            xhr.send();
        }else{
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
            xhr.send(str.slice(0,str.length-1));
        }
    }else{
        // 9. jsonp请求
        let script = document.createElement("script");
        script.id = "abc";
        script.src = url;
        document.body.appendChild(script);
        // 10. 声明全局变量（在局部声明全局）
        window[data[filedName]] = function(res){
            // 14. 发送数据之前，判断是否需要解析数据
            res = dataType==="json" ?  JSON.parse(res) : res;
            // 11. jsonp的成功
            // 更严谨的逻辑：成功之后，没有失败，也不能再次成功
            success && success(res);
            // 15-1. jsonp请求成功之后，删除script标签
            script && script.remove();
            error = null;
            success = null;
        }
    }
    setTimeout(()=>{
        // 12. 超时
        // jsonp没有状态可以判断，所以只能按照超时报错
        // 更严谨的逻辑：成功之后，没有失败，也不能再次成功
        error && error("timeout");
        // 15-2. jsonp请求失败之后，删除script标签
        const s = document.getElementById("abc");
        s && s.remove();
        success = null;
        error = null;
    }, timeout)
}



